home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / e / amigae33a.lha / E_v3.3a / Src.lha / Src / Pd / queens.e < prev    next >
Text File  |  1996-02-18  |  2KB  |  81 lines

  1.  
  2. -> Copyright © 1996 Guichard Damien.
  3.  
  4. OPT OSVERSION=37
  5.  
  6. OBJECT queen
  7.   myrow:LONG
  8.   mycolumn:LONG
  9.   neighbor:PTR TO queen
  10.   boardsize:LONG
  11. ENDOBJECT
  12.  
  13. PROC build(aQueen,col,size) OF queen
  14.   self.neighbor:=aQueen
  15.   self.mycolumn:=col
  16.   self.myrow:=1
  17.   self.boardsize:=size
  18.   IF self.neighbor THEN self.neighbor.first()
  19. ENDPROC
  20.  
  21. PROC checkCol(colNumber,rowNumber) OF queen
  22.   DEF cd
  23.   IF rowNumber=self.myrow THEN RETURN FALSE
  24.   cd:=colNumber-self.mycolumn
  25.   IF self.myrow+cd=rowNumber THEN RETURN FALSE
  26.   IF self.myrow-cd=rowNumber THEN RETURN FALSE
  27.   IF self.neighbor THEN RETURN self.neighbor.checkCol(colNumber,rowNumber)
  28. ENDPROC TRUE
  29.  
  30. PROC first() OF queen
  31.   self.myrow:=1
  32. ENDPROC self.checkrow()
  33.  
  34. PROC next() OF queen
  35.   self.myrow:=self.myrow+1
  36. ENDPROC self.checkrow()
  37.  
  38. PROC checkrow() OF queen
  39.   IF self.neighbor=NIL
  40.     IF self.myrow>self.boardsize THEN RETURN 0
  41.     RETURN self.myrow
  42.   ENDIF
  43.   WHILE self.myrow<=self.boardsize
  44.     IF self.neighbor.checkCol(self.mycolumn,self.myrow) THEN
  45.       RETURN self.myrow
  46.     self.myrow:=self.myrow+1
  47.   ENDWHILE
  48.   IF self.neighbor.next()=0 THEN RETURN 0
  49. ENDPROC self.first()
  50.  
  51. PROC printboard() OF queen
  52.   DEF x
  53.   IF self.neighbor THEN self.neighbor.printboard()
  54.   FOR x:=1 TO self.boardsize
  55.     FputC(stdout,IF x=self.myrow THEN "Q" ELSE ".")
  56.   ENDFOR
  57.   FputC(stdout,"\n")
  58. ENDPROC
  59.  
  60. PROC main() HANDLE
  61.   DEF myargs:PTR TO LONG,rdargs
  62.   DEF lastq=NIL:PTR TO queen,newq:PTR TO queen
  63.   DEF size,x
  64.   myargs:=New(8)
  65.   IF (rdargs:=ReadArgs('BOARDSIZE/N/A,ALL/S',myargs,NIL))=NIL THEN Raise(1)
  66.   IF (size:=Long(myargs[0]))<=0 THEN Raise(1)
  67.   FOR x:=1 TO size DO lastq:=NEW newq.build(lastq,x,size)
  68.   IF lastq.first() THEN lastq.printboard()
  69.   IF myargs[1]=FALSE THEN Raise(0)
  70.   WHILE TRUE
  71.     EXIT CtrlC()
  72.     EXIT lastq.next()=0
  73.     FputC(stdout,"\n")
  74.     lastq.printboard()
  75.   ENDWHILE
  76. EXCEPT DO
  77.   IF rdargs THEN FreeArgs(rdargs)
  78.   IF exception THEN WriteF('Bad Args!\n')
  79. ENDPROC
  80.  
  81.